package finanz.kontrolle;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import classes.ArrayGenerico;
import classes.Funcoes;
import classes.Parametros;
import classes.SpinAdapterGenerico;

import android.app.AlertDialog;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.content.Intent;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;

public class LancamentoCadastroActivity extends MenuActivity implements OnClickListener {
	
	private Parametros par = Parametros.getInstance();
	private SpinAdapterGenerico adapterPessoa;
	private SpinAdapterGenerico adapterConta;
	private SpinAdapterGenerico adapterCategoria;
	private ArrayGenerico[] pessoas;
	private ArrayGenerico[] contas;
	private ArrayGenerico[] categorias;
	private String id;
	private Spinner spnPessoa;
	private Spinner spnConta;
	private Spinner spnCategoria;
	private Button btnDataVencimento;
	private EditText txtValor;
	private EditText txtObservacao;
	private CheckBox chkLiquidado;
	
	private int mYear;
    private int mMonth;
    private int mDay;

    static final int DATE_DIALOG_ID = 0;
    
    private DatePickerDialog.OnDateSetListener mDateSetListener =
            new DatePickerDialog.OnDateSetListener() {
                public void onDateSet(DatePicker view, int year,  int monthOfYear, int dayOfMonth) {
                    mYear = year;
                    mMonth = monthOfYear;
                    mDay = dayOfMonth;
                    updateDisplay();
                }
            };
            
	public void onCreate( Bundle bundle ) {
		super.onCreate( bundle );
		setContentView( R.layout.lancamentocadastro);
		
		Bundle extras = getIntent().getExtras();

		id = extras.getString( "LancamentoID" );
		
		this.listarCombos();

		spnPessoa = ( Spinner ) findViewById( R.id.spnPessoa );
		spnConta = ( Spinner ) findViewById( R.id.spnConta );
		spnCategoria = ( Spinner ) findViewById( R.id.spnCategoria );
		btnDataVencimento = ( Button ) findViewById( R.id.btnDataVencimento );
		txtValor = ( EditText ) findViewById( R.id.txtValor );
		txtObservacao = ( EditText ) findViewById( R.id.txtObservacao );
		chkLiquidado = ( CheckBox ) findViewById( R.id.chkLiquidado );
		
		 final Calendar c = Calendar.getInstance();
	        mYear = c.get( Calendar.YEAR );
	        mMonth = c.get( Calendar.MONTH );
	        mDay = c.get( Calendar.DAY_OF_MONTH );
		
		if ( id.equals( "0" ) )
			updateDisplay();
		
        btnDataVencimento.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                showDialog(DATE_DIALOG_ID);
            }
        });
			
		Button btnSalvarConta = ( Button ) findViewById( R.id.btnSalvar );
		btnSalvarConta.setOnClickListener( this );
		
		Button btnCancelar = ( Button ) findViewById( R.id.btnCancelar );
		btnCancelar.setOnClickListener( this );
	}

    private void updateDisplay() {
    	btnDataVencimento.setText(
            new StringBuilder()
		            .append(mDay).append("/")        
		            .append(mMonth + 1).append("/")
                    .append(mYear));
    }

    private void updateDisplay( String date ) {
    	String[] datas = date.split( "-" );
    	btnDataVencimento.setText(
            new StringBuilder()
		            .append( datas[2] ).append( "/" )
		            .append( datas[1] ).append( "/" )
                    .append( datas[0] )
            );
    }
    
	protected Dialog onCreateDialog(int id) {
	    switch (id) {
	    case DATE_DIALOG_ID:
	        return new DatePickerDialog(this,
	                    mDateSetListener,
	                    mYear, mMonth, mDay);
	    }
	    return null;
	}

	public void onClick( View arg0 ) {
		int mensagem = R.string.msgSalvoSucesso;
		
		switch ( arg0.getId()  ) {
			case R.id.btnSalvar:
					if ( spnPessoa.getSelectedItemId() == 0 )
						mensagem =  R.string.msgSelecionePessoa;
					else if ( spnConta.getSelectedItemId() == 0 )
						 mensagem =  R.string.msgSelecioneConta;
					else if ( spnCategoria.getSelectedItemId() == 0 )
						 mensagem =  R.string.msgSelecioneCategoria;
					else if ( txtValor.getText().length() <= 0 )
						mensagem =  R.string.msgPreenchaValor;
					else
						mensagem = this.salvar();
					
					if ( mensagem != R.string.msgSalvoSucesso ) {
						new AlertDialog.Builder( this )
						.setTitle( "Alerta" )
						.setMessage( mensagem )
						.setNeutralButton( "Ok", null).show();
					}
				break;
			case R.id.btnCancelar:
				this.volta();
				break;
		}
	}
	
	private void volta() {
		Intent i = new Intent( LancamentoCadastroActivity.this, LancamentoActivity.class );
		startActivity( i );
		finish();
	}
	
	protected int salvar( ) {
		int mensagem = R.string.msgSalvoSucesso;
		
		String strUrl = par.getUrl().toString() + getResources().getString( R.string.urlLancamentoSalvar);
		
		HttpClient httpclient = new DefaultHttpClient();
	    HttpPost httppost = new HttpPost( strUrl );

	    try {
	    	String liquidado = "0";
			if ( chkLiquidado.isChecked() )
				liquidado = "1";
	    	
			List<NameValuePair> LancamentoValuePairs = new ArrayList<NameValuePair>(8);
			LancamentoValuePairs.add(new BasicNameValuePair("DatabaseID", par.getDatabase()));
			LancamentoValuePairs.add(new BasicNameValuePair("LancamentoID", id));
			LancamentoValuePairs.add(new BasicNameValuePair("PessoaID", pessoas[ (int) spnPessoa.getSelectedItemId() ].getID()));
			LancamentoValuePairs.add(new BasicNameValuePair("ContaID", contas[ (int) spnConta.getSelectedItemId() ].getID()));
			LancamentoValuePairs.add(new BasicNameValuePair("LancamentoCategoriaID", categorias[ (int) spnCategoria.getSelectedItemId() ].getID()));
			LancamentoValuePairs.add(new BasicNameValuePair("DataVencimento", btnDataVencimento.getText().toString()));
			LancamentoValuePairs.add(new BasicNameValuePair("Valor", txtValor.getText().toString()));
			LancamentoValuePairs.add(new BasicNameValuePair("Observacao", txtObservacao.getText().toString()));
			LancamentoValuePairs.add(new BasicNameValuePair("Liquidado", liquidado));
			httppost.setEntity(new UrlEncodedFormEntity(LancamentoValuePairs));

	        HttpResponse response = httpclient.execute(httppost);

	        Funcoes f = new Funcoes();
	        StringBuilder retorno = f.inputStreamToString( response.getEntity().getContent() );

	        if ( retorno.toString().equals( "1" ) ) {
				mensagem = R.string.msgSalvoSucesso;
				
				Toast t = Toast.makeText( this, mensagem, Toast.LENGTH_SHORT );
				t.setGravity( Gravity.CENTER, 0, 0 );
				t.show();
				
				this.volta();
	        } else
	        	mensagem = R.string.msgErroSalvar;
	        
	    } catch (IOException e) {
	    	mensagem = R.string.msgErroConectar;
	    }
		
	    return mensagem;
	}

	protected <adapter> void listarCombos(  ) {
		String strUrl = par.getUrl().toString() + getResources().getString( R.string.urlLancamentoCadastro);
		
		HttpClient httpclient = new DefaultHttpClient();
	    HttpPost httppost = new HttpPost( strUrl );

	    try {
	        List<NameValuePair> LancamentoValuePairs = new ArrayList<NameValuePair>( 2 );
	        LancamentoValuePairs.add( new BasicNameValuePair( "DatabaseID", "" + par.getDatabase() ) );
	        
	        if ( !id.equals( "0" ) )
	        	LancamentoValuePairs.add(new BasicNameValuePair("LancamentoID", id));
	        
	        httppost.setEntity( new UrlEncodedFormEntity( LancamentoValuePairs ) );

	        HttpResponse response = httpclient.execute( httppost );

	        Funcoes f = new Funcoes();
	        StringBuilder retorno = f.inputStreamToString( response.getEntity().getContent() );
	        
			try {
				
				JSONObject jo = new JSONObject( retorno.toString() );
				JSONArray arrayPessoas = jo.getJSONArray( "pessoas" );
				JSONArray arrayContas = jo.getJSONArray( "contas" );
				JSONArray arrayCategorias = jo.getJSONArray( "categorias" );

				pessoas = new ArrayGenerico[ arrayPessoas.length() ];
				contas = new ArrayGenerico[ arrayContas.length() ];
				categorias = new ArrayGenerico[ arrayCategorias.length() ]; 
				
				for ( int p = 0; p < pessoas.length; p++ ) {
					JSONObject pessoa = new JSONObject( arrayPessoas.getJSONObject( p ).toString() );
					
					pessoas[ p ] = new ArrayGenerico();
					pessoas[ p ].setID( pessoa.getString( "PessoaID" ) );
					pessoas[ p ].setLabel( pessoa.getString( "Nome" ) );
				}
				
				for ( int p = 0; p < contas.length; p++ ) {
					JSONObject conta = new JSONObject( arrayContas.getJSONObject( p ).toString() );
					
					contas[ p ] = new ArrayGenerico();
					contas[ p ].setID( conta.getString( "ContaID" ) );
					contas[ p ].setLabel( conta.getString( "Nome" ) );
				}
				
				for ( int p = 0; p < categorias.length; p++ ) {
					JSONObject categoria = new JSONObject( arrayCategorias.getJSONObject( p ).toString() );
					
					categorias[ p ] = new ArrayGenerico();
					categorias[ p ].setID( categoria.getString( "LancamentoCategoriaID" ) );
					categorias[ p ].setLabel( categoria.getString( "Nome" ) );
				}
				
				adapterPessoa = new SpinAdapterGenerico( LancamentoCadastroActivity.this, android.R.layout.simple_spinner_item, pessoas);
				adapterConta = new SpinAdapterGenerico( LancamentoCadastroActivity.this, android.R.layout.simple_spinner_item, contas);
				adapterCategoria = new SpinAdapterGenerico( LancamentoCadastroActivity.this, android.R.layout.simple_spinner_item, categorias);
				
				spnPessoa = ( Spinner ) findViewById( R.id.spnPessoa );
				spnPessoa.setAdapter( adapterPessoa );

				spnConta = ( Spinner ) findViewById( R.id.spnConta );
				spnConta.setAdapter( adapterConta );

				spnCategoria = ( Spinner ) findViewById( R.id.spnCategoria );
				spnCategoria.setAdapter( adapterCategoria );

				if ( !id.equals( "0" ) ) {
					JSONObject dados = new JSONObject( jo.getJSONObject( "dados" ).toString() );

					int posPessoa = 0;
					for ( int p = 0; p < pessoas.length; p++ )
						if ( pessoas[ p ].getID().equals( dados.getString( "PessoaID" ) ) )
							posPessoa = p;
					
					int posConta = 0;
					for ( int co = 0; co < contas.length; co++ )
						if ( contas[ co ].getID().equals( dados.getString( "ContaID" ) ) )
							posConta = co;
					
					int posCategoria = 0;
					for ( int ca = 0; ca < categorias.length; ca++ )
						if ( categorias[ ca ].getID().equals( dados.getString( "LancamentoCategoriaID" ) ) )
							posCategoria = ca;

					spnPessoa.setSelection( posPessoa );
					spnConta.setSelection( posConta );
					spnCategoria.setSelection( posCategoria );
					
					btnDataVencimento = ( Button ) findViewById( R.id.btnDataVencimento );
					txtValor = ( EditText ) findViewById( R.id.txtValor );
					txtObservacao = ( EditText ) findViewById( R.id.txtObservacao );
					chkLiquidado = ( CheckBox ) findViewById( R.id.chkLiquidado );
					Button btnSalvarConta = ( Button ) findViewById( R.id.btnSalvar );

					this.updateDisplay( dados.getString( "DataVencimento" ) );
					txtValor.setText( dados.getString( "Valor" ).toString() );
					txtObservacao.setText( dados.getString( "Observacao" ) );
					
					if ( dados.getString( "Liquidado" ).equals( "1" ) ) {
						chkLiquidado.setChecked( true );
						
						spnPessoa.setEnabled( false );
						spnConta.setEnabled( false );
						spnCategoria.setEnabled( false );
						btnDataVencimento.setEnabled( false );
						txtValor.setEnabled( false );
						txtObservacao.setEnabled( false );
						chkLiquidado.setEnabled( false );
						btnSalvarConta.setEnabled( false );
					}
					
				} else {
					if ( arrayPessoas.length() == 2 )
						spnPessoa.setSelection( 1 );
	
					if ( arrayContas.length() == 2 )
						spnConta.setSelection( 1 );
	
					if ( arrayCategorias.length() == 2 )
						spnCategoria.setSelection( 1 );
				}
			} catch (JSONException e) {
				e.printStackTrace();
			}
			
	    }  catch (IOException e) {
	    	e.printStackTrace();
		}

	}

}